﻿(function () {
  function e(a) {
    l.call(this, a);
    this.hintContainer = this.codeContainer = null;
  }
  var l = ToolbarConfigurator.AbstractToolbarModifier,
    g = ToolbarConfigurator.FullToolbarEditor;
  ToolbarConfigurator.ToolbarTextModifier = e;
  e.prototype = Object.create(l.prototype);
  e.prototype._onInit = function (a, d) {
    l.prototype._onInit.call(this, void 0, d);
    this._createModifier(d ? this.actualConfig : void 0);
    'function' === typeof a && a(this.mainContainer);
  };
  e.prototype._createModifier = function (a) {
    function d(a) {
      var b = c(a);
      if (null !== b.charsBetween) {
        var d = k.getUnusedButtonsArray(
            k.actualConfig.toolbar,
            !0,
            b.charsBetween
          ),
          e = a.getCursor(),
          b = CodeMirror.Pos(e.line, e.ch - b.charsBetween.length),
          h = a.getTokenAt(e);
        '{' === a.getTokenAt({ line: e.line, ch: h.start }).string &&
          (d = ['name']);
        if (0 !== d.length) return new f(b, e, d);
      }
    }
    function f(a, c, b) {
      this.from = a;
      this.to = c;
      this.list = b;
      this._handlers = [];
    }
    function c(a, c) {
      var b = {};
      b.cur = a.getCursor();
      b.tok = a.getTokenAt(b.cur);
      b['char'] = c || b.tok.string.charAt(b.tok.string.length - 1);
      var d = a
          .getRange(CodeMirror.Pos(b.cur.line, 0), b.cur)
          .split('')
          .reverse()
          .join(''),
        d = d.replace(/(['|"]\w*['|"])/g, '');
      b.charsBetween = d.match(/(^\w*)(['|"])/);
      b.charsBetween &&
        ((b.endChar = b.charsBetween[2]),
        (b.charsBetween = b.charsBetween[1].split('').reverse().join('')));
      return b;
    }
    function b(a) {
      setTimeout(function () {
        a.state.completionActive ||
          CodeMirror.showHint(a, d, {
            hintsClass: 'toolbar-modifier',
            completeSingle: !1,
          });
      }, 100);
      return CodeMirror.Pass;
    }
    var k = this;
    this._createToolbar();
    this.toolbarContainer && this.mainContainer.append(this.toolbarContainer);
    l.prototype._createModifier.call(this);
    this._setupActualConfig(a);
    a = this.actualConfig.toolbar;
    a = CKEDITOR.tools.isArray(a)
      ? '\tconfig.toolbar \x3d ' +
        ('[\n\t\t' +
          g
            .map(a, function (a) {
              return l.stringifyJSONintoOneLine(a, {
                addSpaces: !0,
                noQuotesOnKey: !0,
                singleQuotes: !0,
              });
            })
            .join(',\n\t\t') +
          '\n\t]') +
        ';'
      : 'config.toolbar \x3d [];';
    a = ['CKEDITOR.editorConfig \x3d function( config ) {\n', a, '\n};'].join(
      ''
    );
    var e = new CKEDITOR.dom.element('div');
    e.addClass('codemirror-wrapper');
    this.modifyContainer.append(e);
    this.codeContainer = CodeMirror(e.$, {
      mode: { name: 'javascript', json: !0 },
      lineNumbers: !1,
      lineWrapping: !0,
      viewportMargin: Infinity,
      value: a,
      smartIndent: !1,
      indentWithTabs: !0,
      indentUnit: 4,
      tabSize: 4,
      theme: 'neo',
      extraKeys: {
        Left: b,
        Right: b,
        "'''": b,
        "'\"'": b,
        Backspace: b,
        Delete: b,
        'Shift-Tab': 'indentLess',
      },
    });
    this.codeContainer.on('endCompletion', function (a, b) {
      var d = c(a);
      void 0 !== b && a.replaceSelection(d.endChar);
    });
    this.codeContainer.on('change', function () {
      var a = k.codeContainer.getValue(),
        a = k._evaluateValue(a);
      null !== a
        ? ((k.actualConfig.toolbar = a.toolbar
            ? a.toolbar
            : k.actualConfig.toolbar),
          k._fillHintByUnusedElements(),
          k._refreshEditor(),
          k.mainContainer.removeClass('invalid'))
        : k.mainContainer.addClass('invalid');
    });
    this.hintContainer = new CKEDITOR.dom.element('div');
    this.hintContainer.addClass('toolbarModifier-hints');
    this._fillHintByUnusedElements();
    this.hintContainer.insertBefore(e);
  };
  e.prototype._fillHintByUnusedElements = function () {
    var a = this.getUnusedButtonsArray(this.actualConfig.toolbar, !0),
      a = this.groupButtonNamesByGroup(a),
      d = g
        .map(a, function (a) {
          var b = g
            .map(a.buttons, function (a) {
              return '\x3ccode\x3e' + a + '\x3c/code\x3e ';
            })
            .join('');
          return [
            '\x3cdt\x3e\x3ccode\x3e',
            a.name,
            '\x3c/code\x3e\x3c/dt\x3e\x3cdd\x3e',
            b,
            '\x3c/dd\x3e',
          ].join('');
        })
        .join(' '),
      f =
        '\x3cdt class\x3d"list-header"\x3eToolbar group\x3c/dt\x3e\x3cdd class\x3d"list-header"\x3eUnused items\x3c/dd\x3e';
    a.length || (f = '\x3cp\x3eAll items are in use.\x3c/p\x3e');
    this.codeContainer.refresh();
    this.hintContainer.setHtml(
      '\x3ch3\x3eUnused toolbar items\x3c/h3\x3e\x3cdl\x3e' +
        f +
        d +
        '\x3c/dl\x3e'
    );
  };
  e.prototype.getToolbarGroupByButtonName = function (a) {
    var d = this.fullToolbarEditor.buttonNamesByGroup,
      f;
    for (f in d)
      for (var c = d[f], b = c.length; b--; ) if (a === c[b]) return f;
    return null;
  };
  e.prototype.getUnusedButtonsArray = function (a, d, f) {
    d = !0 === d ? !0 : !1;
    var c = e.mapToolbarCfgToElementsList(a);
    a = Object.keys(this.fullToolbarEditor.editorInstance.ui.items);
    a = g.filter(a, function (a) {
      var d = '-' === a;
      a = void 0 === f || 0 === a.toLowerCase().indexOf(f.toLowerCase());
      return !d && a;
    });
    a = g.filter(a, function (a) {
      return -1 == CKEDITOR.tools.indexOf(c, a);
    });
    d && a.sort();
    return a;
  };
  e.prototype.groupButtonNamesByGroup = function (a) {
    var d = [],
      f = JSON.parse(JSON.stringify(this.fullToolbarEditor.buttonNamesByGroup)),
      c;
    for (c in f) {
      var b = f[c],
        b = g.filter(b, function (b) {
          return -1 !== CKEDITOR.tools.indexOf(a, b);
        });
      b.length && d.push({ name: c, buttons: b });
    }
    return d;
  };
  e.mapToolbarCfgToElementsList = function (a) {
    function d(a) {
      return '-' !== a;
    }
    for (var f = [], c = a.length, b = 0; b < c; b += 1)
      a[b] &&
        'string' !== typeof a[b] &&
        (f = f.concat(g.filter(a[b].items, d)));
    return f;
  };
  e.prototype._setupActualConfig = function (a) {
    a = a || this.editorInstance.config;
    CKEDITOR.tools.isArray(a.toolbar) ||
      (a.toolbarGroups ||
        (a.toolbarGroups = this.fullToolbarEditor.getFullToolbarGroupsConfig(
          !0
        )),
      this._fixGroups(a),
      (a.toolbar = this._mapToolbarGroupsToToolbar(
        a.toolbarGroups,
        this.actualConfig.removeButtons
      )),
      (this.actualConfig.toolbar = a.toolbar),
      (this.actualConfig.removeButtons = ''));
  };
  e.prototype._mapToolbarGroupsToToolbar = function (a, d) {
    d = d || this.editorInstance.config.removedBtns;
    d = 'string' == typeof d ? d.split(',') : [];
    for (var f = a.length; f--; ) {
      var c = this._mapToolbarSubgroup(a[f], d);
      'separator' === a[f].type
        ? (a[f] = '/')
        : CKEDITOR.tools.isArray(c) && 0 === c.length
        ? a.splice(f, 1)
        : (a[f] = 'string' == typeof c ? c : { name: a[f].name, items: c });
    }
    return a;
  };
  e.prototype._mapToolbarSubgroup = function (a, d) {
    if ('string' == typeof a) return a;
    for (var f = a.groups ? a.groups.length : 0, c = [], b = 0; b < f; b += 1) {
      var e = a.groups[b],
        e =
          this.fullToolbarEditor.buttonsByGroup[
            'string' === typeof e ? e : e.name
          ] || [],
        e = this._mapButtonsToButtonsNames(e, d),
        g = e.length,
        c = c.concat(e);
      g && c.push('-');
    }
    '-' == c[c.length - 1] && c.pop();
    return c;
  };
  e.prototype._mapButtonsToButtonsNames = function (a, d) {
    for (var f = a.length; f--; ) {
      var c = a[f],
        c =
          'string' === typeof c
            ? c
            : this.fullToolbarEditor.getCamelCasedButtonName(c.name);
      -1 !== CKEDITOR.tools.indexOf(d, c) ? a.splice(f, 1) : (a[f] = c);
    }
    return a;
  };
  e.prototype._evaluateValue = function (a) {
    var d;
    try {
      var f = {};
      Function(
        'var CKEDITOR \x3d {}; ' + a + '; return CKEDITOR;'
      )().editorConfig(f);
      d = f;
      for (var c = d.toolbar.length; c--; )
        d.toolbar[c] || d.toolbar.splice(c, 1);
    } catch (b) {
      d = null;
    }
    return d;
  };
  e.prototype.mapToolbarToToolbarGroups = function (a) {
    function d(a, b) {
      a = a.slice();
      for (var d = b.length; d--; ) {
        var c = a.indexOf(b[d]);
        -1 !== c && a.splice(c, 1);
      }
      return a;
    }
    for (var f = {}, c = [], b = [], c = a.length, e = 0; e < c; e++)
      if ('/' === a[e]) b.push('/');
      else {
        var g = a[e].items,
          m = {};
        m.name = a[e].name;
        m.groups = [];
        for (var l = g.length, p = 0; p < l; p++) {
          var n = g[p];
          if ('-' !== n) {
            var h = this.getToolbarGroupByButtonName(n);
            -1 === m.groups.indexOf(h) && m.groups.push(h);
            f[h] = f[h] || {};
            h = f[h].buttons = f[h].buttons || {};
            h[n] = h[n] || { used: 0, origin: m.name };
            h[n].used++;
          }
        }
        b.push(m);
      }
    c = (function (a, b) {
      var c = [],
        e;
      for (e in a)
        var f = a[e],
          g = b[e].slice(),
          c = c.concat(d(g, Object.keys(f.buttons)));
      return c;
    })(f, this.fullToolbarEditor.buttonNamesByGroup);
    return { toolbarGroups: b, removeButtons: c.join(',') };
  };
  return e;
})();
